package com.example.tcp2504.MultithreadingExample;

// 导入 Java 并发包中的相关类
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

// 定义一个类 FileTransferManager，用于管理文件传输任务
public class FileTransferManager {
    public static void main(String[] args) {
        // 定义服务器的地址和端口号
        String serverAddress = "localhost";
        int serverPort = 8080;
        // 定义要传输的文件路径数组
        String[] filePaths = {"file1.txt", "file2.txt", "file3.txt"}; // 示例文件路径
        // 创建一个固定大小的线程池，线程池大小为 3
        ExecutorService executorService = Executors.newFixedThreadPool(3); // 根据需要设置线程池大小
        // 创建一个数组，用于存储每个文件传输任务的进度对象
        TransferProgress[] progressList = new TransferProgress[filePaths.length];

        // 遍历文件路径数组，为每个文件创建一个传输任务并提交到线程池
        for (int i = 0; i < filePaths.length; i++) {
            // 为每个文件创建一个 TransferProgress 对象，用于跟踪传输进度
            progressList[i] = new TransferProgress();
            // 创建一个 FileTransferTask 对象，传入服务器地址、端口、文件路径和进度对象
            FileTransferTask task = new FileTransferTask(serverAddress, serverPort, filePaths[i], progressList[i]);
            // 将任务提交到线程池中执行
            executorService.submit(task);
        }

        // 定期打印每个文件的传输进度
        while (!executorService.isTerminated()) { // 检查线程池是否已终止所有任务
            try {
                // 每秒暂停一次，用于更新进度
                Thread.sleep(1000); // 每秒更新一次进度
                // 遍历进度列表，打印每个文件的传输进度
                for (int i = 0; i < filePaths.length; i++) {
                    // 使用 printf 格式化输出文件名和传输进度百分比
                    System.out.printf("File %s transfer progress: %.2f%%%n", filePaths[i], progressList[i].getProgressPercentage());
                }
            } catch (InterruptedException e) {
                // 捕获并打印线程中断异常
                e.printStackTrace();
            }
        }

        // 关闭线程池
        executorService.shutdown();
        try {
            // 等待线程池中的所有任务完成，最多等待 1 分钟
            executorService.awaitTermination(1, TimeUnit.MINUTES);
        } catch (InterruptedException e) {
            // 捕获并打印线程中断异常
            e.printStackTrace();
        }
    }
}